package com.template.app.common.service;

import com.template.app.common.bean.UploadResult;
import com.template.app.common.enumerate.MaterialAddFlagEnum;
import com.template.app.common.service.parser.MaterialParser;
import com.template.app.common.service.parser.MaterialParserFactory;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.LinkedList;
import java.util.List;
import java.util.UUID;


@Service
public class FileUploadService {
	private Logger logger = Logger.getLogger(getClass());
	@Autowired
	private MaterialParserFactory materialParserFactory;
	// 将上传的文件存到数据库
	/**
	 * 解析上传的文件 解压缩
	 * 
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public List<UploadResult> handleFileUpload(MultipartFile file) {
		// 各上传文件的结果详情的列表
		List<UploadResult> fileList = new LinkedList<UploadResult>();

		String originalFileName = file.getOriginalFilename();// 封装好的函数

	
		try {
			
			String newFileName = generateFileName(originalFileName);
			String fileType = getFileType(newFileName);
			//TODO 
			MaterialParser materialParser = materialParserFactory
					.getParserByType(fileType);// 根据文件后缀匹配对应的文件操作对象ImgParser
			materialParser.getFileSize(originalFileName, file.getBytes(), file.getSize());
			materialParser.addToResultList(originalFileName, "",
					file.getBytes(), file.getSize(), fileList);

		} catch (Exception e) {
			logger.error(e);
			UploadResult result = new UploadResult();
			result.setOriginalFilename(originalFileName);
			result.setIsOK(MaterialAddFlagEnum.ERROR);
			result.setReason(e.getLocalizedMessage());
			fileList.add(result);
		}
		return fileList;
	}
	private String getFileType(String fileName) throws Exception {
		return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
	}

	/**
	 * 
	 * 生成新的文件名
	 */
	private String generateFileName(String upFileName)
			throws Exception {
		// 直接获取文件后缀就行
		int fileTypePosIndex = upFileName.lastIndexOf('.');// 最后一个'.'的下标位置
		String fileType = "";
		if (fileTypePosIndex > 0) {
			fileType = upFileName.substring(fileTypePosIndex);
		} else {
			throw new Exception("文件名格式错误:[" + upFileName + "]");
		}
		// 后缀截取点
		String fileName = UUID.randomUUID() + fileType;// （随机数+文件类型）组成了新的文件名
		return fileName;
	}
	
	/**
	 * 普通文件上传
	 * @param request
	 * @param response
	 */
//	public void fileUpload(HttpServletRequest request,
//			HttpServletResponse response) {
//		//上传文件的保存目录
//		String savePath = "";
//		//上传文件的临时保存目录
//		String tempPath = "";
//		File tempFile = new File(tempPath);//建立一个临时目录
//		if(!tempFile.exists()){
//			//创建临时目录
//			tempFile.mkdir();
//		}
//		try{
//			//使用Apache文件上传组件处理文件上传步骤
//			
//			//1.创建一个DistFileItemFactory工厂
//			DiskFileItemFactory factory = new DiskFileItemFactory();
//			//设置工厂的缓冲v大小，当上传的文件大小超过缓冲区大小时，生成临时文件
//			factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100kb，如果不指定，那么缓冲区的大小默认是10kb
//			//设置上传时，生成的临时文件的保存目录
//			factory.setRepository(tempFile);
//			
//			//2.创建一个文件上传的解析器
//			ServletFileUpload upload = new ServletFileUpload(factory);
//			//监听文件上传进度
//			upload.setProgressListener(new ProgressListener() {
//				@Override
//				public void update(long pBytesRead, long pContentLength, int pItems) {
//					logger.info("文件大小为："+pContentLength+"，当前已处理："+pBytesRead);
//				}
//			});
//			//解决上传文件名的中文乱码
//			upload.setHeaderEncoding("UTF-8");
//			
//			//3.判断提交上来的数据是否是上传表单的数据
//			if(!ServletFileUpload.isMultipartContent(request)){
//				return;
//			}
//			//设置上传文件的大小的最大值
//			upload.setFileSizeMax(1024*1024*2);//2M
//			//设置上传文件总量的最大值=同时上传的多个文件的大小的最大值的和
//			upload.setSizeMax(1024*1024*10);
//			
//			//4.使用ServletFileUpload解析器解析上传的数据，返回List
//			List<FileItem> list = upload.parseRequest(request);
//			for(FileItem item : list){
//				//如果fileItem中封装的是普通输入项的数据
//				if(item.isFormField()){
//					String originlName = item.getFieldName();
//					//解决普通输入项的数据的中文乱码问题
//					String value = item.getString("utf-8");
//					logger.info("普通输入项数据："+originlName+"="+value);
//				}else{//如果fileitem中封装的是上传文件
//					String originalFileName = item.getName();
//					logger.info("上传文件的源文件名为："+originalFileName);
//					if(originalFileName==null || "".equals(originalFileName.trim())){
//						continue;
//					}
//					//得到上传为那几的扩展名
//					String fileType = getFileType(originalFileName);
//					//获取item中的上传文件的输入流
//					InputStream in = item.getInputStream();
//					//生成新的文件名
//					String newFileName = generateFileName(originalFileName);
//					//创建文件输出流
//					FileOutputStream out = new FileOutputStream(savePath+"\\"+newFileName+"."+fileType);
//					//创建缓冲区
//					byte buffer[] = new byte[1024];
//					int len = in.read(buffer);
//					while(len>0){
//						out.write(buffer, 0, len);
//					}
//					in.close();
//					out.close();
//				}
//			}
//		}catch (Exception e){
//			
//		}
//		
//	}


}
